package com.kurt.service;

import com.kurt.dto.MenuDTO;
import com.kurt.dto.RoleDTO;
import com.kurt.dto.create.RoleCreateRequest;
import com.kurt.dto.query.RoleQueryRequest;
import com.kurt.dto.update.RoleUpdateRequest;
import com.kurt.entity.SysRole;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * 角色服务接口
 * 提供角色相关的业务逻辑方法
 */
public interface RoleService extends BaseService<SysRole, Long> {

    /**
     * 创建角色
     *
     * @param createRequest 创建请求
     * @return 角色信息
     */
    RoleDTO createRole(RoleCreateRequest createRequest);

    /**
     * 更新角色
     *
     * @param updateRequest 更新请求
     * @return 角色信息
     */
    RoleDTO updateRole(RoleUpdateRequest updateRequest);

    /**
     * 根据ID获取角色详情
     *
     * @param id 角色ID
     * @return 角色信息
     */
    RoleDTO getRoleById(Long id);

    /**
     * 分页查询角色
     *
     * @param queryRequest 查询请求
     * @return 分页结果
     */
    Page<RoleDTO> getRolePage(RoleQueryRequest queryRequest);

    /**
     * 根据条件查询角色列表
     *
     * @param queryRequest 查询请求
     * @return 角色列表
     */
    List<RoleDTO> getRoleList(RoleQueryRequest queryRequest);

    /**
     * 删除角色
     *
     * @param id 角色ID
     * @return 是否成功
     */
    boolean deleteRole(Long id);

    /**
     * 批量删除角色
     *
     * @param ids 角色ID列表
     * @return 是否成功
     */
    boolean deleteRoles(List<Long> ids);

    /**
     * 分配菜单权限
     *
     * @param roleId  角色ID
     * @param menuIds 菜单ID列表
     * @return 是否成功
     */
    boolean assignMenus(Long roleId, List<Long> menuIds);

    /**
     * 获取角色菜单权限
     *
     * @param roleId 角色ID
     * @return 菜单列表
     */
    List<MenuDTO> getRoleMenus(Long roleId);

    /**
     * 检查角色名称是否存在
     *
     * @param name 角色名称
     * @return 是否存在
     */
    boolean existsByName(String name);

    /**
     * 检查角色名称是否存在（排除指定ID）
     *
     * @param name      角色名称
     * @param excludeId 排除的角色ID
     * @return 是否存在
     */
    boolean existsByNameAndIdNot(String name, Long excludeId);

    /**
     * 检查角色编码是否存在
     *
     * @param code 角色编码
     * @return 是否存在
     */
    boolean existsByCode(String code);

    /**
     * 检查角色编码是否存在（排除指定ID）
     *
     * @param code      角色编码
     * @param excludeId 排除的角色ID
     * @return 是否存在
     */
    boolean existsByCodeAndIdNot(String code, Long excludeId);

    /**
     * 更新角色状态
     *
     * @param id     角色ID
     * @param status 状态
     * @return 是否成功
     */
    boolean updateStatus(Long id, Integer status);

    /**
     * 更新角色排序
     *
     * @param id        角色ID
     * @param sortOrder 排序号
     * @return 是否成功
     */
    boolean updateSortOrder(Long id, Integer sortOrder);
}
